package co.edu.udea.impl;

import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.transaction.annotation.Transactional;

import co.edu.udea.dao.DispositivoDao;
import co.edu.udea.model.Dispositivo;
import co.edu.udea.model.Respuesta;
import exceptions.ExecptionRTF;



/***
 * 
 * @author Cristina Isabel Mejia Gonzalez
 *
 *Implementacion de persistencia para la clase Dispositivo
 */


public class DispositivoImp extends HibernateDaoSupport implements DispositivoDao{

	Logger log = Logger.getLogger(this.getClass());
	
	/**
	 * @param dispositivo, Metodo que perite guardar un dispositivo nuevo
	 * @return devuelve el dispositivo si el proceso fue exitoso
	 */
	@Transactional
	public Dispositivo agregarDispositivo(Dispositivo dispositivo) throws ExecptionRTF{

		try {
			Session session = getSessionFactory().openSession();  
			session.save(dispositivo);
			session.flush();
			return dispositivo;
			
		} catch (Exception e) {

			log.error("No se pudo agregar el dispositivo", e); 
			throw new ExecptionRTF(e);
		}
	}
	
	@Transactional
	public boolean eliminarDispositivo(Dispositivo disp) throws ExecptionRTF{

		try {
			Session session = getSessionFactory().openSession();  
			session.delete(disp);
			session.flush();
			return true;
			
		} catch (Exception e) {

			log.error("No se pudo eliminar el dispositivo", e); 
			throw new ExecptionRTF(e);
		}
	}

	/**
	 * @param codigoDispositivo, Metodo que permite consulta un dispositivo segun su codigo
	 * @return devuelve el dispositivo si el proceso fue exitoso
	 */
	@Override
	public Dispositivo consultarDisponibilidadDispositivo(
			String codigoDispositivo) throws ExecptionRTF{

		try {
			return (Dispositivo)getHibernateTemplate().get(Dispositivo.class, codigoDispositivo);
			
		} catch (Exception e) {

			log.error("No se encontro dispositivo con codigo: "+ codigoDispositivo, e); 
			throw new ExecptionRTF(e);
		}
	}

	/**
	 * @param Dispositivo, Metodo que permite modificar el estado de un dispositivo
	 * @return devuelve el dispositivo si el proceso fue exitoso
	 */
	@Transactional
	public Dispositivo cambiarEstadoDispositivo(Dispositivo dispositivo) throws ExecptionRTF{
		
		try {
			Session session = getSessionFactory().openSession();  
			session.update(dispositivo);
			session.flush();
			return dispositivo;
			
		} catch (Exception e) {

			log.error("No se cambiar el estado del dispositivo", e); 
			throw new ExecptionRTF(e);
		}
	}
	
	@Override
	public Dispositivo consultarDispositivo(String codigoDispositivo)
			throws ExecptionRTF {
		return getHibernateTemplate().get(Dispositivo.class, codigoDispositivo);
	}

}
